home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 12: Textmags & Docs / nf_archive_12.iso / MAGS / SOURCES / ATARI_SRC.ZIP / atari source / FALCON / ACC / DRIVERS.ACC / WINDOWS.C < prev    next >
Encoding:
C/C++ Source or Header  |  2001-02-10  |  7.7 KB  |  367 lines

  1. /* FILE:  WINDOWS.C
  2.  *==========================================================================
  3.  * DATE:  November 20, 1992
  4.  * DESCRIPTION: Window Routines for DRIVERS.ACC
  5.  *
  6.  * INCLUDE FILES:   WINDOWS.H
  7.  */
  8.  
  9.  
  10. /* INCLUDE FILES
  11.  *==========================================================================
  12.  */
  13. #include <sys\gemskel.h>
  14. #include <string.h>
  15. #include <tos.h>
  16.  
  17. #include "country.h"
  18. #include "drivers.h"
  19.  
  20. #include "mainstuf.h"
  21. #include "device.h"
  22. #include "text.h"
  23.  
  24.  
  25.  
  26. /* PROTOTYPES
  27.  *==========================================================================
  28.  */
  29. void    init_window( void );
  30. void    Wm_Redraw( int *msg );
  31. void    Wm_Topped( int *msg );
  32. void    Wm_Closed( int *msg );
  33. void    Wm_Moved( int *msg );
  34. BOOLEAN Create_Window( void );
  35. void    open_window( void );
  36. void    do_redraw( OBJECT *tree, GRECT *prect );
  37. void    GrowShrinkBox( BOOLEAN flag );
  38. void    Send_Redraw( GRECT *rect );
  39.  
  40.  
  41.  
  42. /* DEFINES
  43.  *==========================================================================
  44.  */
  45. #define NO_WINDOW     ( -1 )
  46. #define WKIND        ( NAME | CLOSER | MOVER )
  47. #define GROWBOX        0
  48. #define SHRINKBOX    1
  49.  
  50.  
  51. /* EXTERNS
  52.  *==========================================================================
  53.  */
  54. EXTERN int AES_Version;
  55. EXTERN int gl_ncolors;
  56.  
  57.  
  58. /* GLOBALS
  59.  *==========================================================================
  60.  */
  61. int     WIND_WIDTH;
  62. int     WIND_HEIGHT;
  63. WINFO    w;                /* w.r == outer area of window
  64.                      * w.work == work area of window
  65.                          * w.phy  == work area of config
  66.                      * w.work is also the work area of
  67.                      * the cpxs
  68.                      */
  69.                     
  70.  
  71.  
  72.  
  73. /* FUNCTIONS
  74.  *==========================================================================
  75.  */
  76.  
  77.  
  78. /* init_window()
  79.  *==========================================================================
  80.  * Initialize the window dimensions, parts and structures
  81.  *
  82.  * IN:  void
  83.  * OUT: void
  84.  *
  85.  * GLOBAL:    WINFO w:    window structure
  86.  */
  87. void
  88. init_window( void )
  89. {
  90.    ActiveTree( ad_front );
  91.    WIND_WIDTH = ObW( FRONT );
  92.    WIND_HEIGHT = ObH( FRONT );
  93.  
  94.    w.kind     = WKIND;
  95.    w.id       = NO_WINDOW;     
  96.    strcpy( w.name, window_title );
  97.    w.wchar    = gl_wbox;
  98.    w.hchar    = gl_hbox;
  99.    w.work.g_x = desk.g_x;
  100.    w.work.g_y = desk.g_y;
  101.    
  102.    w.work.g_w = WIND_WIDTH;
  103.    w.work.g_h = WIND_HEIGHT;
  104.  
  105.    /* Convert to 3D if possible - ONLY if AES 0x0330 or Greater */
  106.    if( AES_Version >= 0x0330 )
  107.       w.work.g_h = WIND_HEIGHT + 4;
  108.  
  109.    w.fulled   = FALSE;
  110. }
  111.  
  112.  
  113.  
  114.  
  115.  
  116. /* Wm_Redraw()
  117.  *==========================================================================
  118.  * Handle main event_multi window redraw messages.
  119.  * 
  120.  * IN:  int *msg:    Event messages
  121.  * OUT: void
  122.  *
  123.  * GLOBAL:     WINFO  w:       window structure
  124.  *           int xconfig:    The index of which config routine is active
  125.  *                   -1 when none active
  126.  */
  127. void
  128. Wm_Redraw( int *msg )
  129. {
  130.    GRECT  *rect;
  131.  
  132.    if( msg[3] == w.id )
  133.    {
  134.       rect = (GRECT *)&msg[4];
  135.       do_redraw( tree, rect );
  136.    }      
  137. }
  138.  
  139.  
  140.  
  141.  
  142.  
  143.  
  144. /* Wm_Topped()
  145.  *==========================================================================
  146.  * Handle main event_multi window topped messages
  147.  */
  148. void
  149. Wm_Topped( int *msg )
  150. {
  151.    if( msg[3] == w.id )
  152.    {
  153.          wind_set( w.id, WF_TOP );
  154.    }         
  155. }
  156.  
  157.  
  158.  
  159.  
  160.  
  161. /* Wm_Closed()
  162.  *==========================================================================
  163.  * Handle main event_multi window close messages
  164.  *
  165.  * IN:   int *msg:        Event messages
  166.  * OUT:  void
  167.  *
  168.  * GLOBAL:    WINFO w:    window structure messages
  169.  *        _app:        TRUE- we ran as a PRG file
  170.  */
  171. void
  172. Wm_Closed( int *msg )
  173. {
  174.    if( msg[3] == w.id )
  175.    {
  176.       wind_close( w.id );
  177.       wind_delete( w.id );
  178.       GrowShrinkBox( SHRINKBOX );
  179.       w.id = NO_WINDOW;
  180.  
  181.       if( _app )
  182.         gem_exit( 0 );
  183.    }
  184. }
  185.  
  186.  
  187.  
  188.  
  189.  
  190.  
  191. /* Wm_Moved()
  192.  *==========================================================================
  193.  * Handle main event_multi window moved messages.
  194.  *
  195.  * IN:   int *msg:    Event messages
  196.  * OUT:  void
  197.  *
  198.  * GLOBAL:    WINFO w:  window structure
  199.  */
  200. void
  201. Wm_Moved( int *msg )
  202. {
  203.    GRECT  *rect;
  204.  
  205.    if( msg[3] == w.id )
  206.    {
  207.      rect = (GRECT *)&msg[4];
  208.      w.r  = *rect;
  209.      Wind_set( w.id, WF_CURRXYWH, ( WARGS *)&w.r );
  210.      Wind_get( w.id, WF_WORKXYWH, ( WARGS *)&w.work );
  211.      ObX( ROOT ) = w.work.g_x;
  212.      ObY( ROOT ) = w.work.g_y;
  213.    }
  214. }
  215.  
  216.  
  217.  
  218.  
  219. /* Create_Window()
  220.  *==========================================================================
  221.  * Creates the Window for the open_window() call.
  222.  * This must be called before
  223.  */
  224. BOOLEAN
  225. Create_Window( void )
  226. {
  227.     if( (w.id = Wind_create( w.kind, &desk )) < 0 )
  228.     {
  229.         w.id = NO_WINDOW;
  230.         return( FALSE );
  231.     }
  232.     return( TRUE );    
  233. }
  234.  
  235.  
  236.  
  237.  
  238. /* open_window()
  239.  *==========================================================================
  240.  * Open the Xcontrol window
  241.  *
  242.  * IN:  VOID
  243.  * OUT: BOOLEAN:    TRUE if window opening was success
  244.  *
  245.  * GLOBAL:  WINFO w:    window structure
  246.  */
  247. void
  248. open_window( void )
  249. {
  250.     wind_set( w.id, WF_NAME, w.name );
  251.  
  252.     /* cjg - re-init window width and height every time we open */
  253.     w.work.g_w = WIND_WIDTH;
  254.     w.work.g_h = WIND_HEIGHT;
  255.  
  256.    /* Convert to 3D if possible - ONLY if AES 0x0330 or Greater */
  257.    if( AES_Version >= 0x0330 )
  258.       w.work.g_h = WIND_HEIGHT + 4;
  259.     
  260.     Wind_calc( 0, w.kind, &w.work, &w.r );
  261.     w.r.g_x = max( desk.g_x, (desk.g_w - w.r.g_w )/2 );
  262.     w.r.g_y = max( desk.g_y, (desk.g_h - w.r.g_h )/2 );
  263.     Wind_calc( 1, w.kind, &w.r, &w.work );
  264.  
  265.     GrowShrinkBox( GROWBOX );    
  266.     Wind_open( w.id, &w.r );  
  267.  
  268.     wind_get( w.id, WF_WORKXYWH, &w.work.g_w,&w.work.g_y,&w.work.g_w,&w.work.g_h );
  269.     wind_get( w.id, WF_CURRXYWH, &w.r.g_x,&w.r.g_y,&w.r.g_w,&w.r.g_h );
  270.     
  271.     ObX( FRONT ) = w.work.g_x;
  272.     ObY( FRONT ) = w.work.g_y;
  273. }
  274.  
  275.  
  276.  
  277.  
  278. /* do_redraw()
  279.  *==========================================================================
  280.  * Standard object tree redraw routine for handling object trees
  281.  *
  282.  * IN:  OBJECT *tree:        object tree
  283.  *      int    object:        object to redraw
  284.  *    GRECT  *prect:        GRECT of dirtied area
  285.  *
  286.  * OUT: void
  287.  *
  288.  * GLOBAL:  WINFO  w:        window structure
  289.  */
  290. void
  291. do_redraw( OBJECT *tree, GRECT *prect )
  292. {
  293.    GRECT rect;
  294.    
  295.    Wind_get( w.id, WF_FIRSTXYWH, ( WARGS *)&rect );
  296.    while( !rc_empty( &rect ) )
  297.    {
  298.        if( rc_intersect( prect, &rect ))
  299.        {
  300.              Vsync();
  301.        Objc_draw( tree, ROOT, MAX_DEPTH, &rect );
  302.        }
  303.        Wind_get( w.id, WF_NEXTXYWH, ( WARGS *)&rect );
  304.    }
  305. }
  306.  
  307.  
  308.  
  309.  
  310.  
  311.  
  312. /* GrowShrinkBox()
  313.  *==========================================================================
  314.  * Perform a Grow or Shrink Box animation
  315.  *
  316.  * IN:   BOOLEAN flag:        Flag for grow or shrink
  317.  * OUT:  void
  318.  *
  319.  * GLOBAL:   WINFO w:        Window structure
  320.  */
  321. void
  322. GrowShrinkBox( BOOLEAN flag )
  323. {
  324.     GRECT rect;
  325.  
  326.     rect      = w.r;
  327.     rect.g_x += rect.g_w / 2;
  328.     rect.g_y += rect.g_h / 2;
  329.  
  330.     if( !flag )
  331.     {
  332.        rect.g_w = gl_wbox * 2;
  333.        rect.g_h = gl_hbox * 2;
  334.        Graf_growbox( &rect, &w.r );
  335.     }
  336.     else
  337.     {
  338.        rect.g_w = gl_wbox;
  339.        rect.g_h = gl_hbox;
  340.        Graf_shrinkbox( &rect, &w.r );
  341.     }
  342. }
  343.  
  344.  
  345.  
  346. /* Send_Redraw()
  347.  *==========================================================================
  348.  * Force the sending of a redraw message.
  349.  * IN: GRECT *rect:    The GRECT of the dirty area
  350.  * OUT: void
  351.  */
  352. void
  353. Send_Redraw( GRECT *rect )
  354. {
  355.      int msg_buff[8];
  356.      
  357.      msg_buff[0] = WM_REDRAW;
  358.      msg_buff[1] = gl_apid;
  359.      msg_buff[2] = 0;
  360.      msg_buff[3] = (int)w.id;
  361.      msg_buff[4] = rect->g_x;
  362.      msg_buff[5] = rect->g_y;
  363.      msg_buff[6] = rect->g_w;
  364.      msg_buff[7] = rect->g_h;
  365.      appl_write( gl_apid, 16, msg_buff );
  366. }
  367.